package com.dhcc.bpm.modules.scf.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.ReadSheet;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel解析工具类
 */
public class ExcelUtil {

    private ExcelUtil() {
    }

    /**
     * 从字节数组中读取 Excel 数据
     *
     * @param fileAsBytes Excel 文件的字节数组
     * @param clazz       目标对象的类
     * @param <T>         对象类型
     * @param rowNum      解析开始行数
     * @param sheetName   工作表表名
     * @return Excel 数据集合
     * @throws IOException IO 异常
     */
    public static <T> List<T> readExcel(byte[] fileAsBytes, Class<T> clazz, String sheetName, int rowNum) throws IOException {
        // 将字节数组转换为 ByteArrayInputStream
        ByteArrayInputStream inputStream = new ByteArrayInputStream(fileAsBytes);
        // 创建 ExcelReader 对象
        ExcelReader excelReader = EasyExcel.read(inputStream).build();
        try {
            // 创建 Excel 数据集合
            List<T> dataList = new ArrayList<>();
            // 读取 Excel 数据
            ReadSheet readSheet = EasyExcel.readSheet(sheetName).head(clazz).headRowNumber(rowNum).registerReadListener(
                    new AnalysisEventListener<T>() {
                        @Override
                        public void invoke(T data, AnalysisContext analysisContext) {
                            // 在这里处理每一行 Excel 数据
                            dataList.add(data);// 将数据添加到集合中
                        }

                        @Override
                        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                            // 所有数据处理完毕后的操作
                        }
                    }
            ).build();
            excelReader.read(readSheet);
            return dataList;
        } finally {
            // 关闭 ExcelReader
            excelReader.finish();
        }
    }
}
